import random
import pandas as pd  
import pyecharts.options as opts
from pyecharts.charts import Bar3D
from pyecharts.faker import Faker
from pyecharts.charts import Bar
import csv
from operator import itemgetter
from pyecharts.globals import SymbolType
from pyecharts.commons.utils import JsCode


# 读取Excel文件  
df = pd.read_excel('1.xlsx',sheet_name='前端')  
grouped = df.groupby(['城市','学历'])['平均薪资'].mean().reset_index()  
  
# 然后，计算每个城市所有学历的平均薪资的平均值  
# 这可以通过先按城市分组，然后对每个城市的平均薪资再求平均来实现  

  
# 查看结果  
#print(grouped)  
  
# 如果需要将结果保存到新的Excel文件  
grouped.to_excel('grouped.xlsx', index=False)

grouped_sorted = grouped.sort_values(by='平均薪资', ascending=False)
#print(grouped_sorted)
#print('---------------------------------------------------------')

citys=grouped_sorted['城市'].unique()
for city in citys:
    df_xian = grouped_sorted[grouped_sorted['城市'] == city] 
    #print(df_xian)
    #print('-----------------------------------------------------------')
top_10_avg_salaries = grouped_sorted.head(10)
#print(top_10_avg_salaries)



df2 = pd.read_excel('1.xlsx',sheet_name='经理&')  
grouped2 = df2.groupby(['城市','学历'])['平均薪资'].mean().reset_index()  
  
# 然后，计算每个城市所有学历的平均薪资的平均值  
# 这可以通过先按城市分组，然后对每个城市的平均薪资再求平均来实现  

  
# 查看结果  
#print(grouped2)  
#print('---------------------------------------------------------')
# 如果需要将结果保存到新的Excel文件  
grouped2.to_excel('grouped2.xlsx', index=False)

grouped_sorted2 = grouped2.sort_values(by='平均薪资', ascending=False)
#print(grouped_sorted2)
#print('---------------------------------------------------------')

citys2=grouped_sorted2['城市'].unique()
for city2 in citys2:
    df_xian2 = grouped_sorted2[grouped_sorted2['城市'] == city2] 
    #print(df_xian2)
    #print('-----------------------------------------------------------')
top_10_avg_salaries2 = grouped_sorted2.head(10)
#print(top_10_avg_salaries2)



df3 = pd.read_excel('1.xlsx',sheet_name='食品研发')  
grouped3 = df3.groupby(['城市','学历'])['平均薪资'].mean().reset_index()  
  
# 然后，计算每个城市所有学历的平均薪资的平均值  
# 这可以通过先按城市分组，然后对每个城市的平均薪资再求平均来实现  

  
# 查看结果  
#print(grouped3)  
#print('---------------------------------------------------------')
# 如果需要将结果保存到新的Excel文件  
grouped3.to_excel('grouped3.xlsx', index=False)

grouped_sorted3 = grouped3.sort_values(by='平均薪资', ascending=False)
#print(grouped_sorted3)
#print('---------------------------------------------------------')

citys3=grouped_sorted3['城市'].unique()
for city3 in citys3:
    df_xian3 = grouped_sorted3[grouped_sorted3['城市'] == city3] 
    #print(df_xian3)
   # print('-----------------------------------------------------------')
top_10_avg_salaries3 = grouped_sorted3.head(10)
#print(top_10_avg_salaries3)





df4 = pd.read_excel('1.xlsx',sheet_name='产品经理')  
grouped4 = df4.groupby(['城市','学历'])['平均薪资'].mean().reset_index()  
  
# 然后，计算每个城市所有学历的平均薪资的平均值  
# 这可以通过先按城市分组，然后对每个城市的平均薪资再求平均来实现  


# 查看结果  
print(grouped4)  
print('---------------------------------------------------------')
# 如果需要将结果保存到新的Excel文件  
grouped4.to_excel('grouped4.xlsx', index=False)

grouped_sorted4 = grouped4.sort_values(by='平均薪资', ascending=False)
print(grouped_sorted4)
print('---------------------------------------------------------')

citys4=grouped_sorted4['城市'].unique()
for city4 in citys4:
    df_xian4 = grouped_sorted4[grouped_sorted4['城市'] == city4] 
    print(df_xian4)
    print('-----------------------------------------------------------')
top_10_avg_salaries4 = grouped_sorted4.head(10)
print(top_10_avg_salaries4)

filename = 'biao2.csv'

# 初始化存储所有行的列表
all_rows = []

# 打开文件并读取所有行数据
with open(filename, mode='r', encoding='utf-8') as file:
    csv_reader = csv.DictReader(file)
    for row in csv_reader:
        # 假设城市列是"城市"，平均薪资列是"平均薪资"，根据实际的列名进行调整
        city = row['城市']
        average_salary = float(row['平均薪资'])  # 假设薪资是数值类型，转换为float进行排序
        all_rows.append((average_salary, city))  # 存储为(薪资, 城市)的元组

# 按照平均薪资降序排列
sorted_rows = sorted(all_rows, reverse=True, key=itemgetter(0))

# 只取前20行数据
top_20_rows = sorted_rows[:20]

# 分离出城市和平均薪资
top_20_cities = [city for _, city in top_20_rows]
top_20_salaries = [salary for salary, _ in top_20_rows]

# 打印结果查看
print("Top 20 Cities:", top_20_cities)
print("Top 20 Average Salaries:", top_20_salaries)

# 创建柱状图对象
bar = Bar()

# 添加数据系列，指定系列名称、数据以及是否为堆叠
bar.add_xaxis(top_20_cities)
bar.add_yaxis("前二十名平均薪资城市", top_20_salaries, stack="stack_name")

# 设置全局配置项
bar.set_global_opts(title_opts=opts.TitleOpts(title="数据"),
                    xaxis_opts=opts.AxisOpts(
                        axislabel_opts=opts.LabelOpts(
                            interval=0,  # 强制显示所有标签
                            rotate=45,  # 逆时针旋转45度
                            # 调整字体大小
                        ),
                    ),

                    )

# 渲染图表到HTML文件
bar.render("bar_chart1.html")

df = pd.read_csv('final.csv')
# 按照'平均薪资'列降序排列
df_sorted = df.sort_values(by='出现次数', ascending=False)
new_df_sorted = df_sorted.head(10)
print(new_df_sorted)

# 提取职业名称和出现次数，并将出现次数转换为整数
attr = new_df_sorted['标准岗位名称']
count = new_df_sorted['出现次数'].astype(int)  # 将出现次数转换为整数类型

# 创建柱状图对象
bar = Bar()

# 添加数据系列，不需要指定stack，除非您确实想要堆叠效果
bar.add_xaxis(attr.tolist())  # 确保attr是列表格式
bar.add_yaxis("前十名岗位出现次数", count.tolist(), stack="stack_name")  # 确保count是列表格式

# 设置全局配置项
bar.set_global_opts(title_opts=opts.TitleOpts(title="前十名岗位出现次数柱状图"),
                    xaxis_opts=opts.AxisOpts(
                        axislabel_opts=opts.LabelOpts(
                            interval=0,  # 强制显示所有标签
                            rotate=45,  # 逆时针旋转45度
                            # 调整字体大小
                        ),
                    ),

                    )
# 渲染图表到HTML文件
bar.render("bar_chart2.html")

xdata1 = ['西安', '成都', '上海', '苏州', '广州', '深圳', '重庆', '南京', '杭州']
ydata1 = ['本科', '硕士', '博士', '学历不限']

# 使用提供的数据作为z轴数据
zdata1 = ['19409', '62500', '0', '0', '20666', '60000', '0', '0', '28806', '0', '0', '0', '27500', '0', '0', '0',
          '20441', '0', '0', '27500', '23533', '17375', '0', '26071', '23333',
          '0', '0', '25000', '24375', '0', '0', '20000', '23444', '0', '0', '19500']
# 因为zdata现在是字符串列表，我们需要将其转换为整数列表
zdata1_int = [int(x) for x in zdata1]
filtered_data = [x for x in zdata1_int if x != 0]

# 检查过滤后的列表是否为空，如果为空则没有非零值
if filtered_data:
    min_value_excluding_zero = min(filtered_data)
else:
    min_value_excluding_zero = None

data1 = [(x, y, z) for x, y, z in zip(xdata1 * len(ydata1), ydata1 * len(xdata1), zdata1_int)]

bar3d1 = (
    Bar3D(
        init_opts=opts.InitOpts(
            theme='white',  # 图表主题 white dark
        )
    )
    .add(
        series_name='前端',
        data=data1,

        xaxis3d_opts=opts.Axis3DOpts(data=xdata1, type_='category'),
        yaxis3d_opts=opts.Axis3DOpts(data=ydata1, type_='category'),
        zaxis3d_opts=opts.Axis3DOpts(type_='value'),
    )
    .set_global_opts(
        title_opts=opts.TitleOpts(title="3D柱状图"),

        visualmap_opts=opts.VisualMapOpts(
            is_show=True,  # 显示视觉映射配置
            is_piecewise=False,  # 是否使用分段型
            min_=min_value_excluding_zero,  # 数据范围最小值
            max_=max(zdata1_int),  # 数据范围最大值
            range_color=['#50a3ba', '#eac736', '#d94e5d']  # 颜色范围，从蓝色到黄色到红色
        ),
        xaxis_opts=opts.AxisOpts(
            axislabel_opts=opts.LabelOpts(
                interval=0,  # 强制显示所有标签
                rotate=45,  # 逆时针旋转45度
                # 调整字体大小
            ),
        )
    )
)
# 渲染到HTML文件
bar3d1.render("test1.html")

xdata2 = ['保定', '香港', '宜春', '北京', '武汉', '南宁', '芜湖', '蚌埠', '肇庆']
ydata2 = ['本科', '硕士', '博士', '学历不限']

# 使用提供的数据作为z轴数据
zdata2 = ['85000', '0', '0', '0',
          '50000', '0', '0', '0',
          '0', '0', '0', '0',
          '46050', '30000', '0', '17500',
          '11500', '0', '0', '45000',
          '45000', '0', '0', '0',
          '0', '0', '0', '0',
          '0', '0', '0', '40000',
          '40000', '0', '0', '0']

zdata2_int = [int(x) for x in zdata2]
filtered_data2 = [x for x in zdata2_int if x != 0]

# 检查过滤后的列表是否为空，如果为空则没有非零值
if filtered_data2:
    min_value_excluding_zero2 = min(filtered_data2)
else:
    min_value_excluding_zero2 = None

data2 = [(x, y, z) for x, y, z in zip(xdata2 * len(ydata2), ydata2 * len(xdata2), zdata2_int)]

bar3d2 = (
    Bar3D(
        init_opts=opts.InitOpts(
            theme='white',  # 图表主题 white dark
        )
    )
    .add(
        series_name='经理&',
        data=data2,
        xaxis3d_opts=opts.Axis3DOpts(data=xdata2, type_='category'),
        yaxis3d_opts=opts.Axis3DOpts(data=ydata2, type_='category'),
        zaxis3d_opts=opts.Axis3DOpts(type_='value'),
    )

    .set_global_opts(
        title_opts=opts.TitleOpts(title="3D柱状图"),
        visualmap_opts=opts.VisualMapOpts(
            is_show=True,  # 显示视觉映射配置
            is_piecewise=False,  # 是否使用分段型
            min_=min_value_excluding_zero2,  # 数据范围最小值
            max_=max(zdata2_int),  # 数据范围最大值
            range_color=['#50a3ba', '#eac736', '#d94e5d']  # 颜色范围，从蓝色到黄色到红色
        ),

    )
)

bar3d2.render("test2.html")

xdata3 = ['合肥', '重庆', '肇庆', '上海', '北京', '武汉', '潮州', '天津', '南通']
ydata3 = ['本科', '硕士', '博士', '学历不限']

# 使用提供的数据作为z轴数据
zdata3 = ['20333', '0', '200000', '0',
          '8000', '75000', '0', '0',
          '16000', '0', '0', '40000',
          '23111', '22600', '0', '37500',
          '34863', '25000', '33500', '9166',
          '7833', '0', '32500', '11500',
          '17500', '0', '0', '0',
          '30000', '15000', '0', '40000',
          '12500', '12500', '0', '30000']

zdata3_int = [int(x) for x in zdata3]
filtered_data3 = [x for x in zdata3_int if x != 0]

# 检查过滤后的列表是否为空，如果为空则没有非零值
if filtered_data3:
    min_value_excluding_zero3 = min(filtered_data3)
else:
    min_value_excluding_zero3 = None

data3 = [(x, y, z) for x, y, z in zip(xdata3 * len(ydata3), ydata3 * len(xdata3), zdata3_int)]

bar3d3 = (
    Bar3D(
        init_opts=opts.InitOpts(
            theme='white',  # 图表主题 white dark
        )
    )
    .add(
        series_name='食品研发',
        data=data3,
        xaxis3d_opts=opts.Axis3DOpts(data=xdata3, type_='category'),
        yaxis3d_opts=opts.Axis3DOpts(data=ydata3, type_='category'),
        zaxis3d_opts=opts.Axis3DOpts(type_='value'),
    )

    .set_global_opts(
        title_opts=opts.TitleOpts(title="3D柱状图"),
        visualmap_opts=opts.VisualMapOpts(
            is_show=True,  # 显示视觉映射配置
            is_piecewise=False,  # 是否使用分段型
            min_=min_value_excluding_zero3,  # 数据范围最小值
            max_=max(zdata3_int),  # 数据范围最大值
            range_color=['#50a3ba', '#eac736', '#d94e5d']  # 颜色范围，从蓝色到黄色到红色
        ),

    )
)

bar3d3.render("test3.html")

xdata4 = ['北京', '香港', '上海', '广州', '深圳', '杭州', '桂林', '南京']
ydata4 = ['本科', '硕士', '博士', '学历不限']

# 使用提供的数据作为z轴数据
zdata4 = ['48472', '17500', '0', '32500',
          '0', '42500', '0', '0',
          '31271', '21250', '0', '40000',
          '34642', '0', '0', '0',
          '32145', '0', '0', '0',
          '31437', '0', '0', '27500',
          '0', '0', '0', '30000',
          '30000', '0', '0', '0',
          '29200', '0', '0', '0']

zdata4_int = [int(x) for x in zdata4]
filtered_data4 = [x for x in zdata4_int if x != 0]

# 检查过滤后的列表是否为空，如果为空则没有非零值
if filtered_data4:
    min_value_excluding_zero4 = min(filtered_data4)
else:
    min_value_excluding_zero4 = None

data4 = [(x, y, z) for x, y, z in zip(xdata4 * len(ydata4), ydata4 * len(xdata4), zdata4_int)]

bar3d4 = (
    Bar3D(
        init_opts=opts.InitOpts(
            width='1500px',
            height='500px',
            theme='white',  # 图表主题 white dark
        )
    )
    .add(
        series_name='产品经理',
        data=data4,
        xaxis3d_opts=opts.Axis3DOpts(data=xdata4, type_='category'),
        yaxis3d_opts=opts.Axis3DOpts(data=ydata4, type_='category'),
        zaxis3d_opts=opts.Axis3DOpts(type_='value'),
    )

    .set_global_opts(
        title_opts=opts.TitleOpts(title="3D柱状图"),
        visualmap_opts=opts.VisualMapOpts(
            is_show=True,  # 显示视觉映射配置
            is_piecewise=False,  # 是否使用分段型
            min_=min_value_excluding_zero4,  # 数据范围最小值
            max_=max(zdata4_int),  # 数据范围最大值
            range_color=['#50a3ba', '#eac736', '#d94e5d']  # 颜色范围，从蓝色到黄色到红色
        ),

    )
)

bar3d4.render("test4.html")



 



